package com.zzyl.common.utils.pdf;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

public class PDFParser {
    public static String parsePdfFromMultipartFile(MultipartFile multipartFile) throws IOException {
        // 验证上传的文件是否为空或非PDF类型（简易验证）
        if (multipartFile.isEmpty()) {
            throw new IOException("上传的文件为空");
        }
        String originalFilename = multipartFile.getOriginalFilename();
        if (originalFilename != null && !originalFilename.toLowerCase().endsWith(".pdf")) {
            throw new IOException("请上传PDF文件");
        }

        // 使用 try-with-resources 确保 PDDocument 被正确关闭
        try (PDDocument document = PDDocument.load(multipartFile.getInputStream())) {

            // 可选：检查文档是否加密
            if (document.isEncrypted()) {
                // 如果已知密码，可以尝试解密：document.decrypt("password");
                // 否则，可能无法处理加密文档并抛出异常
                throw new IOException("该PDF文件已加密，目前不支持解析加密文档。");
            }

            PDFTextStripper textStripper = new PDFTextStripper();
            // 设置文本排序（true表示按阅读顺序排序）
            textStripper.setSortByPosition(true);
            // 设置是否添加更多格式（如段落分隔）
            // textStripper.setAddMoreFormatting(true);
            // 设置页面分隔符
            // textStripper.setPageSeparator("\n--- Page Separator ---\n");

            // 提取整个PDF的文本
            String text = textStripper.getText(document);
            return text;
        } // 这里会自动调用 document.close(), 释放资源
    }
    
    /**
     * 将PDF文件解析为字符串
     * @param filePath PDF文件路径
     * @return 解析后的文本内容
     * @throws IOException 如果文件读取失败
     */
    public static String parsePDFToString(String filePath) throws IOException {
        return parsePDFToString(new File(filePath));
    }
    
    /**
     * 将PDF文件解析为字符串
     * @param file PDF文件对象
     * @return 解析后的文本内容
     * @throws IOException 如果文件读取失败
     */
    public static String parsePDFToString(File file) throws IOException {
        try (PDDocument document = PDDocument.load(file)) {
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(document);
        }
    }
    


    
    /**
     * 获取PDF的总页数
     * @param file PDF文件
     * @return 总页数
     * @throws IOException 如果文件读取失败
     */
    public static int getPageCount(File file) throws IOException {
        try (PDDocument document = PDDocument.load(file)) {
            return document.getNumberOfPages();
        }
    }
}